﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using ModeloEntidades;
using AccesoDatos.DAO;

namespace LogicaControl
{
    public class Controlador_Habilitacion : Controlador
    {
        // Atributos de manejo de instancia (singleton)
        static Controlador_Habilitacion instance = null;
        //------------------------------------------------------------------------------------------
        private DAO_Habilitacion miDAO_Habilitacion = DAO_Habilitacion.Instance;
        private DAO_Localidades miDAO_Localidades = new DAO_Localidades();

        public Habilitacion nueva()
        {
            Habilitacion unaHabilitacion = new Habilitacion();
            Tramite_Matriculacion unTramite_Matriculacion = new Tramite_Matriculacion();
            Consultorio unConsultorio = new Consultorio();
            Administrador unAdministrador = new Administrador();
            Local unLocal = new Local();
            Lugar unLugar = new Lugar();
            //Lugar unLugar2 = new Lugar();
            Propietario unPropietario = new Propietario();
            //Localidad unaLocalidad = new Localidad();
            Departamento unDepartamento = new Departamento();
            //Profesional unProfesional = new Profesional();
            
            unaHabilitacion.Tramite_Matriculacion.Add(unTramite_Matriculacion);
            unTramite_Matriculacion.Administrador = unAdministrador;
            unTramite_Matriculacion.Consultorio = unConsultorio;
            //unTramite_Matriculacion.Consultorio.titular_actual = unProfesional;
            //unTramite_Matriculacion.Consultorio.titular_actual.vive = unLugar;

            unTramite_Matriculacion.Consultorio.Local = unLocal;
            unTramite_Matriculacion.Consultorio.Local.Propietarios.Add(unPropietario);
            //unTramite_Matriculacion.Consultorio.Local.Localidad = unaLocalidad;
            
            
            //unTramite_Matriculacion.Consultorio.Local.Localidad.Departamento = unDepartamento;

            unTramite_Matriculacion.Consultorio.Tramite_Matriculacion = unTramite_Matriculacion;           

            return unaHabilitacion;

        }

        public Requisitos requisitos(Habilitacion unaHabilitacion)
        {
            var tramite_de_habilitacion = unaHabilitacion.Tramite_Matriculacion.First();
            var consultorio = tramite_de_habilitacion.Consultorio;
            var local_para_hablitar = consultorio.Local;

            var requisitos = new Requisitos();

            /*------------------------------------------------------------------------------------------------------
                 2. LISTADO DE PERSONAL
            -------------------------------------------------------------------------------------------------------*/
            // La lista del plantel profesional tiene que estar cerrada...
            requisitos.Listado_personal = tramite_de_habilitacion.lista_plantel_cerrada;
                       
            // si esta cerrada la lista chequeo los certificados....
            if (requisitos.Listado_personal)
            {

                /*------------------------------------------------------------------------------------------------------
                    3.CERTIFICADOS DE MATRICULACIÓN (DEL COLEGIOS)
                -------------------------------------------------------------------------------------------------------*/
                // A priori doy por satisfecho el requisito
                requisitos.Certificado_matriculacion_del_colegio = true;

                foreach (Profecional_colegio unProfecional_del_colegio in consultorio.plantel_profesional.OfType<Profecional_colegio>())
                {
                    // si no tiene certificado...
                    if ((unProfecional_del_colegio.certificado == null) || (!unProfecional_del_colegio.certificado.Value))
                    {
                        // No se puede satisfacer el requisito (con uno que no lo cumpla es suficiente)
                        requisitos.Certificado_matriculacion_del_colegio = false;
                        // Dejo de buscar... ya es suficiente
                        break;
                    }
                }
                /*------------------------------------------------------------------------------------------------------
                    4. CUOTA COLEGIACIÓN AL DÍA  (DEL COLEGIOS)
                -------------------------------------------------------------------------------------------------------*/
                // A priori doy por satisfecho el requisito
                requisitos.Cuota_colegiacion_al_dia_colegio = true;

                foreach (Profecional_colegio unProfecional_de_colegio in consultorio.plantel_profesional.OfType<Profecional_colegio>())
                {
                    // si no tiene la cuota al dia...
                    if ((unProfecional_de_colegio.cuota == null) || (!unProfecional_de_colegio.cuota.Value))
                    {
                        // No se puede satisfacer el requisito (con uno que no lo cumpla es suficiente)
                        requisitos.Cuota_colegiacion_al_dia_colegio = false;
                        // Dejo de buscar... ya es suficiente
                        break;
                    }
                }

                /*------------------------------------------------------------------------------------------------------
                    5. CERTIFICADOS DE MATRICULACIÓN (OTROS COLEGIOS)
                -------------------------------------------------------------------------------------------------------*/
                // A priori doy por satisfecho el requisito
                requisitos.Certificado_matriculacion_otros_colegio = true;

                foreach (Profesional_otro_colegio unProfecional_de_otro_colegio in consultorio.plantel_profesional.OfType<Profesional_otro_colegio>())
                {
                    // si no tiene la cuota al dia...
                    if ((unProfecional_de_otro_colegio.certificado == null) || (!unProfecional_de_otro_colegio.certificado.Value))
                    {
                        // No se puede satisfacer el requisito (con uno que no lo cumpla es suficiente)
                        requisitos.Certificado_matriculacion_otros_colegio = false;
                        // Dejo de buscar... ya es suficiente
                        break;
                    }
                }
                /*------------------------------------------------------------------------------------------------------
                   6.  CERTIFICADOS DE APROBACION DEL LOCAL (OTROS COLEGIOS)
               -------------------------------------------------------------------------------------------------------*/
                // A priori doy por satisfecho el requisito
                requisitos.Certificado_aprobacion_del_local_otros_colegio = true;

                foreach (Profesional_otro_colegio unProfecional_de_otro_colegio in consultorio.plantel_profesional.OfType<Profesional_otro_colegio>())
                {
                    // si no tiene la cuota al dia... //||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||||
                    if ((unProfecional_de_otro_colegio.local_aprobado == null) || (!unProfecional_de_otro_colegio.local_aprobado))
                    {
                        // No se puede satisfacer el requisito (con uno que no lo cumpla es suficiente)
                        requisitos.Certificado_aprobacion_del_local_otros_colegio = false;
                        // Dejo de buscar... ya es suficiente
                        break;
                    }
                }               
                        
            }
            /*------------------------------------------------------------------------------------------------------
                7. PLANO MUNICIPAL APROBADO
            -------------------------------------------------------------------------------------------------------*/
            requisitos.Plano_municipal_aprobado = (local_para_hablitar.plano_municipal != null) ? local_para_hablitar.plano_municipal.Value : false;

            /*------------------------------------------------------------------------------------------------------
               8. PLANO DE CONTINGENCIA
           -------------------------------------------------------------------------------------------------------*/
            requisitos.Plano_contingencia = (local_para_hablitar.plano_contingencia != null) ? local_para_hablitar.plano_contingencia.Value : false;

            /*------------------------------------------------------------------------------------------------------
               8.  BAÑO EN CONSULTORIO 
           -------------------------------------------------------------------------------------------------------*/
            requisitos.Baño_en_consultorio = (local_para_hablitar.baño != null) ? local_para_hablitar.baño.Value : false;

            /*------------------------------------------------------------------------------------------------------
               10. INSPECCIONADO
            -------------------------------------------------------------------------------------------------------*/
            requisitos.Inspeccionado = (local_para_hablitar.Inspecciono != null); // si alguien inspecciono -> Entonces Verdadero

            /*------------------------------------------------------------------------------------------------------
               11. ABONO DEL TRAMITE
            -------------------------------------------------------------------------------------------------------*/
            requisitos.Abono_del_tramite = (tramite_de_habilitacion.Pago != null); // si hay pago -> Entonces Verdadero

            //****************************************************************************************************************//
            return requisitos;

        }

        public List<Habilitacion> obtener()
        {
            return miDAO_Habilitacion.obtener();
        }

        public void guardar(Habilitacion unaHabilitacion)
        {
            miDAO_Habilitacion.guardar(unaHabilitacion);
        }

        public void guardar(Habilitacion unaHabilitacion, Localidad nuevaLocalidad)
        {
            miDAO_Habilitacion.guardar(unaHabilitacion, nuevaLocalidad);
            
        }

        public void actualizar(Habilitacion unaHabilitacion)
        {
            miDAO_Habilitacion.actualizar(unaHabilitacion);
        }
        //------------------------------------------------------------------------------------------
        public static Controlador_Habilitacion Instance
        {
            get
            {
                if (instance == null)
                {
                    lock (padlock)
                    {
                        if (instance == null)
                        {
                            instance = new Controlador_Habilitacion();
                        }
                    }
                }
                return instance;
            }
        }
    }
}
